package com.heatup.apt.common.dao;
import java.math.BigDecimal;
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import com.heatup.apt.model.datacenter.DataCenterOrderDetailModel;
import com.heatup.apt.model.datacenter.DataCenterOrderIncomeAmtModel;
import com.heatup.apt.model.datacenter.DataCenterSortResultModel;
import com.heatup.apt.model.datacenter.DataCenterUserStort;
import com.heatup.apt.model.datacenter.DataCenterVIPDeatilModel;


@Component
public interface DataCenterMapper {
	
	/** 
	1.零售订单数量:(团课、私教、檬营、自助) order_type in (1,2,3,4)
	2.统计周期内，汇总所有(或所选择)门店已付款的零售订单笔数。
	3.已付款:pay_status=1 & order_status !=2  
	4.私教订单统计到总部
	5.参数说明：
		storeId：门店ID，该参数为null表示所有门店。
		startDate：周期开始日期-包含该天数据
		endDate：周期结束日期-不包含该日期数据
		yearMonth：月份，按月查询数据
	*/
	 Integer queryRetailOrderCount(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 
	 * 【零售订单笔数：查看详情】 
		1.零售订单数量：按门店课程分类统计:(团课、私教、檬营、自助) order_type in (1,2,3,4)
		2.统计周期内，汇总所有(或所选择)门店已付款的零售订单笔数。
		3.已付款:pay_status=1 & order_status !=2  
		4.私教订单统计到总部
		5.参数说明：
			storeId：门店ID，该参数为null表示所有门店。
			startDate：周期开始日期-包含该天数据
			endDate：周期结束日期-不包含该日期数据
			yearMonth：月份，按月查询数据
	 * 
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterOrderDetailModel> queryRetailOrderCountDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 【零售流水】 
		1.零售订单数量：按门店课程分类统计:(团课、私教、檬营、自助) order_type in (1,2,3,4)
		2.统计周期内，汇总所有(或所选择)门店已付款的零售订单笔数。
		3.已付款:pay_status=1 & order_status !=2  
		4.私教订单统计到总部
		5.参数说明：
			storeId：门店ID，该参数为null表示所有门店。
			startDate：周期开始日期-包含该天数据
			endDate：周期结束日期-不包含该日期数据
			yearMonth：月份，按月查询数据
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 BigDecimal queryRetailOrderRunningAccountAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 【零售流水:查看详情】 
		1.零售订单数量：按门店课程分类统计:(团课、私教、檬营、自助) order_type in (1,2,3,4)
		2.统计周期内，汇总所有(或所选择)门店已付款的零售订单笔数。
		3.已付款:pay_status=1 & order_status !=2  
		4.私教订单统计到总部
		5.参数说明：
			storeId：门店ID，该参数为null表示所有门店。
			startDate：周期开始日期-包含该天数据
			endDate：周期结束日期-不包含该日期数据
			yearMonth：月份，按月查询数据
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterOrderIncomeAmtModel> queryRetailOrderRunningAccountAmtDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 【零售实收金额】 
		1：零售订单数量：按门店课程分类统计:(团课、私教、檬营、自助) order_type in (1,2,3,4)
		2：数据注释：汇总所选统计周期内以下类型订单的实付金额
			1、所有状态为“已完成”的团课、自助(仅统计普通用户)订单的实付金额
			2、所有已销课的私教课时费（私教订单实付总额/购买节数）
			3、所有已签到的檬营课时费（檬营订单实付总额/该檬营的节数）
		3：参数说明：
				storeId：门店ID，该参数为null表示所有门店。
				startDate：周期开始日期-包含该天数据
				endDate：周期结束日期-不包含该日期数据
				yearMonth：月份，按月查询数据
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterOrderIncomeAmtModel> queryRetailRealIncomeAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	
	/**
	 * 【付费人数明细】
	   统计订单类型： 团课，私教，檬营，自助，购买会员
	   数据注释：所选统计周期内，汇总各门店有付款行为(零售+会员)的人数(去重)
	   按门店，课程分类后，总人数可能<各项和值
	   私教统计在虚拟总部门店；如未有设置会员常去门店，会员订单也计算在虚拟总部门店内。
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterOrderDetailModel> queryPayerCountDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 *  【新增会员数】
	            参数   ：startDate,endDate,yearMonth,storeId   
		数据注释：所选统计周期内，新增的不同类型的会员总数量
		如果参数传入storeId，则表示统计门店相关数据，不传入则统计全部数据。
		关联user_store表中的用户常去门店，判断会员归属门店。
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 Integer queryNweVipCount(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	
	/**
	 *  【新增会员数明细】
	            参数   ：startDate,endDate,yearMonth,storeId   
		数据注释：所选统计周期内，新增的不同类型的会员总数量
		如果参数传入storeId，则表示统计门店相关数据，不传入则统计全部数据。
		关联user_store表中的用户常去门店，判断会员归属门店。
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterVIPDeatilModel> queryNweVipCountDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	

	
	/**
	 * 【会员总流水金额】
		 参数   ：startDate,endDate,yearMonth,storeId   
		数据注释：统计会员订单的流水收入
		如果参数传入storeId，则表示统计门店相关数据，不传入则统计全部数据。
		关联user_store表中的用户常去门店，判断会员归属门店。
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 BigDecimal queryVIPOrderAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	
	/**
	 * 【会员流水金额详情】
		 参数   ：startDate,endDate,yearMonth,storeId   
		数据注释：统计会员订单的流水收入明细，按购买会员长度分组
		如果参数传入storeId，则表示统计门店相关数据，不传入则统计全部数据。
		关联user_store表中的用户常去门店，判断会员归属门店。
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 List<DataCenterVIPDeatilModel> queryVIPOrderAmtDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 *  【会员总实收】
		        数据注释：
			1、会员实收 = （V1+V2+V3…） × 统计天数
			2、V：统计周期内为在线会员的会员日均费用
			3、会员日均费用：用户购买会员时的实付总金额 / 购买天数(含赠送)
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	 BigDecimal queryVipRealIncomeAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate);
	
	
	/**
	 * 【会员零售转化率】
                    数据注释：
		1、分子：分母里有≥1笔零售行为(购买团课、私教、檬营)的人数
		2、分母：本统计周期内的在线会员数
	 */
	 BigDecimal queryVipRetailRechargeRate(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate);
	
	
	/**
	 * 【会员自助转化率】
                   数据注释：
		1、分子：分母里有≥1笔自助订单的人数
		2、分母：本统计周期内的在线会员数
	 */
	 BigDecimal queryVipSelfRechargeRate(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate);
	
	
	/**
	 * 【零售复购率】
	 * 大盘数据查询
		1.统计条件： 
		1)周期：默认统计周期为上线至今；用时间控件，支持用户选择要统计的时间周期；
		2)用户身份：可勾选要查的是“全量”、“非会员”还是“会员”的零售复购率
		2.统计口径：
		1)分母：在所选定时间周期内，至少买过1笔零售订单的用户数
		2)分子：在所选定时间周期内，买过≥2笔零售订单的用户数
	 * @param startDate
	 * @param endDate
	 * @param userType 1:非会员 2：会员 3：全量
	 * @return
	 */
	 BigDecimal queryRetailRepeatChargeRate(@Param("startDate")String startDate, @Param("endDate")String endDate,@Param("userType")String userType);
	
	/**
	 * 
	 * 【排课量】
		1.统计周期：
		2.数据注释：本统计周期内状态为“已结束”的团课数量
	 */
	 Integer querySchedulerCourseCount(@Param("storeId") Integer storeId,@Param("startDate")String startDate, @Param("endDate")String endDate);
	
	/**
	 * 【团课满课率】
		1.统计周期：默认统计周期为上线至今；用时间控件，支持用户选择要统计的时间周期
		2.统计口径：
		1)分母：在所选定时间周期内，所有状态为“已结束”的团课对应“上限人数”之和
		2)分子：在所选定时间周期内，所有状态为“已结束”的团课对应“已报人数+排队人数”之和
	 * 
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	 BigDecimal queryTeamFullClassRate(@Param("storeId") Integer storeId,@Param("startDate")String startDate, @Param("endDate")String endDate);
	
	/**
	 * 用户平均购买次数
	 */
	 BigDecimal queryAveragePayNumberToUser(@Param("storeId") Integer storeId,@Param("startDate")String startDate, @Param("endDate")String endDate,@Param("yearMonth") String yearMonth);  

	/**
	 * 【会员续费率】
	 *  统计周期：会员续费率：仅在按月、按历史汇总里才统计展示该数据  数据注释：
	 *	1、分子：从所选择自然月1号至当前时间，有再次购买1笔会员订单的用户数
	 *	2、分母：选择的自然月内，有购买≥1笔会员订单的用户数
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	 BigDecimal queryVipOrderRepeatChargeRate(@Param("storeId") Integer storeId, @Param("startDate") String startDate,@Param("endDate") String endDate);
	
	/**
	 * 当前在线会员总数
	 * @param storeId
	 */
	 Integer userIsVipCountToNow(@Param("storeId") Integer storeId, @Param("startDate") String startDate,@Param("endDate") String endDate);
	
	/**
	 * 【教练重复购买率排名】
		1.统计周期：默认统计周期为上线至今；用时间控件，支持用户选择要统计的时间周期；
		2.统计口径：
		1)分母：在所选定时间周期内，买过1笔该教练团课的用户数
		2)分子：在所选定时间周期内，买过≥2笔该教练团课的用户数
		3)补充说明：所统计的订单状态限定为“已完成”
		3.将统计到的教练及对应的百分比，按从高到低排序
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	 List<DataCenterSortResultModel> queryCoachSortList(@Param("startDate")String startDate, @Param("endDate")String endDate);
	
	/**
	 * 【课程重复购买率排名】
		1.统计周期：默认统计周期为上线至今；用时间控件，支持用户选择要统计的时间周期；
		2.统计口径：
		1)名词解释：该统计项的课程指“标准课程库的课程”，且仅针对团课
		2)分母：在所选定时间周期内，至少买过1笔该标准课程团课的用户数
		3)分子：在所选定时间周期内，买过≥2笔该标准课程团课的用户数
		4)补充说明：所统计的订单状态限定为“已完成”
		3.将统计到的标准课程及对应的百分比，按从高到低排序
	 * 
	 */
	 List<DataCenterSortResultModel> queryCourseSortList(@Param("startDate")String startDate, @Param("endDate")String endDate);
	
	/**
	 * 团课满课率排序，按课程名称 】
	 * 
	 */
	 List<DataCenterSortResultModel> queryTeamFullClassRateSort(@Param("startDate")String startDate, @Param("endDate")String endDate);
	
	/**
	 * 查询当前门店下面的用户有哪些
	 * 1、level = 1  表示查询门店下面的用户数量
	 * 2、level = 2  表示查询门店下面的会员数量
	 * 3、level = 3  表示查询门店下面的所有用户数量
	 * @param level
	 * @return
	 */
	 List<DataCenterUserStort> queryUserStortByLevel(@Param("level")String level);
	
	/**
	 * 查询在查询时间段内会员的流失数量
	 * 业务逻辑：
	 * 	判断用户在查询时间内由会员变为非会员
	 *  sql: queryStartTime <= vip.endTime and queryEndTIme > vip.endTime
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth 
	 * @return
	 */
	 Integer queryVipLost(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 查询在查询时间段内会员的流失数量明细关联到门店下面
	 * 业务逻辑：
	 * 	判断用户在查询时间内由会员变为非会员，查询不到的门店下面的用户同意算作是总部
	 *  sql: queryStartTime <= vip.endTime and queryEndTIme > vip.endTime
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth 
	 * @return
	 */
	 List<DataCenterUserStort> queryVipLostDetail(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 当期新增团课包月会员数：本统计周期内新增的包月会员数 
	 * 这里的统计还是针对单门店来统计没有涉及到多门店的统计
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 Integer queryMonthCardCount(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 当期新增团课包月会员流水：本统计周期内新增的包月会员的收入流水  
	 * 这里的统计还是针对单门店来统计没有涉及到多门店的统计
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 BigDecimal queryMonthCardRunningAccountAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 当期新增团课包月会员实收：本统计周期内新增的包月会员的实收（统计方法同檬会员） 
	 * 这里的统计还是针对单门店来统计没有涉及到多门店的统计
	 * @param storeId
	 * @param startDate
	 * @param endDate
	 * @param yearMonth
	 * @return
	 */
	 BigDecimal queryMonthCardRealIncomeAmt(@Param("storeId") Integer storeId, @Param("startDate") String startDate,
			@Param("endDate") String endDate, @Param("yearMonth") String yearMonth);
	
	/**
	 * 判断该门店是否拥有包月卡
	 * @param storeId
	 * @return
	 */
	 Integer queryStoreIsHaveCard(@Param("storeId") Integer storeId);
}
